package com.sojson.project.controller.param.verify;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.List;

import com.sojson.config.exception.TransErrorCode;
import com.sojson.enums.EGoodSpecsType;
import com.sojson.project.entity.po.GoodSpecs;
import com.sojson.result.Result;
import com.sojson.util.ArithUtil;
import com.sojson.util.ArrayUtil;
import com.sojson.util.StringUtil;

/**
 * 商品规格组合表参数验证
 * 
 * @author liu
 * @date 2021-03-16
 */
public class GoodSpecsParamVerify {

    /**
     * 单条插入
     * 
     * @param goodSpecs
     * @return
     */
    public static Result<?> insert(GoodSpecs goodSpecs) {
        List<GoodSpecs> goodSpecss = goodSpecs.getGoodSpecss();
        if (StringUtil.isBlankObject(goodSpecss) || goodSpecss.size() < 1) {
            return Result.fail("规格组合列表不能为空！");
        }
        for (GoodSpecs gs : goodSpecss) {
            Result<?> insertOne = insertOne(gs);
            if (insertOne.getCode() != TransErrorCode.SUCCESS.getCode()) {
                return insertOne;
            }
            gs.insertInit();
        }

        return Result.success();
    }

    /**
     * 单条插入
     * 
     * @param goodSpecs
     * @return
     * @throws SQLException
     */
    public static Result<?> insertOne(GoodSpecs goodSpecs) {
        String specsListIds = goodSpecs.getSpecsListIds();
        if (StringUtil.isBlank(specsListIds)) {
            return Result.fail("商品规格ID列表不能为空！");
        }
        String[] split = specsListIds.split(",");
        if (split.length == 0) {
            return Result.fail("商品规格ID不能为空！");
        }
        StringBuilder stringBuilder = new StringBuilder();
        // 升序排序
        ArrayUtil.sort(split);
        // 检查是否全是数组,防止SQL注入
        for (String string : split) {
            // 确保都是数字
            stringBuilder.append(Integer.parseInt(string)).append(",");
        }
        goodSpecs.setSpecsListIds(stringBuilder.substring(0, stringBuilder.length() - 1));
        if (StringUtil.isBlank(goodSpecs.getName())) {
            return Result.fail("规格名称不能为空！");
        }
        if (StringUtil.isBlank(goodSpecs.getGoodId())) {
            return Result.fail("所属商品ID不能为空！");
        }
        Integer stock = goodSpecs.getStock();
        if (StringUtil.isBlank(stock) || stock < 1) {
            return Result.fail("库存不能为空！");
        }
        // BigDecimal originalPrice = goodSpecs.getOriginalPrice();
        // if (StringUtil.isBlank(originalPrice)) {
        // return Result.fail("原价不能为空！");
        // }
        BigDecimal price = goodSpecs.getPrice();
        if (StringUtil.isBlank(price)) {
            return Result.fail("单价不能为空！");
        }
        // int intValueOriginalPrice = originalPrice.intValue();
        int intValuePrice = price.intValue();
        if (intValuePrice < 1) {
            return Result.fail("单价不能小于0.01！");
        }
        // if (intValuePrice > intValueOriginalPrice) {
        // return Result.fail("单价不能大于原价！");
        // }
        // goodSpecs.setOriginalPrice(ArithUtil.intPennyToBigDollar(intValueOriginalPrice));
        goodSpecs.setPrice(ArithUtil.intPennyToBigDollar(intValuePrice));

        return Result.success();
    }

    /**
     * 通过id更新(局部更新)
     * 
     * @param goodSpecs
     * @return
     */
    public static Result<?> updatePartialById(GoodSpecs goodSpecs) {
        if (StringUtil.isBlank(goodSpecs.getId())) {
            return Result.fail("ID不能为空！");
        }
        int buy = EGoodSpecsType.BUY.getCode();
        int goOn = EGoodSpecsType.GO_ON.getCode();
        int buyAndGoOn = EGoodSpecsType.BUY_AND_GO_ON.getCode();
        Integer type = goodSpecs.getType();
        if (StringUtil.isBlank(type)) {
            return Result.fail("类型不能为空！");
        }
        if (type == 2) {
            return Result.fail("类型错误！");
        }
        if (buy == type || buyAndGoOn == type) {
            BigDecimal price = goodSpecs.getPrice();
            if (StringUtil.isBlank(price)) {
                return Result.fail("单价不能为空！");
            }
            int intValuePrice = price.intValue();
            if (intValuePrice < 1) {
                return Result.fail("单价不能小于0.01！");
            }
            goodSpecs.setPrice(ArithUtil.intPennyToBigDollar(intValuePrice));
            if (StringUtil.isBlank(goodSpecs.getPercentageTotal())) {
                return Result.fail("分成金额不能为空！");
            }
            double doubleValue = goodSpecs.getPercentageTotal().doubleValue();
            if (doubleValue >= 1 || doubleValue < 0) {
                return Result.fail("分成百分比不能小于0并且不能大于1！");
            }
        }
        if (goOn == type || buyAndGoOn == type) {
            BigDecimal priceDay = goodSpecs.getPriceDay();
            // BigDecimal originalPrice = goodSpecs.getOriginalPrice();
            if (StringUtil.isBlank(priceDay)) {
                return Result.fail("单价/每天不能为空！");
            }
            // if (StringUtil.isBlank(originalPrice)) {
            // return Result.fail("原价不能为空！");
            // }
            int intValuePrice = priceDay.intValue();
            // int intValueOriginalPrice = originalPrice.intValue();
            if (intValuePrice < 1) {
                return Result.fail("单价/每天不能小于0.01！");
            }
            // if (intValuePrice > intValueOriginalPrice) {
            // return Result.fail("单价/每天不能大于原价！");
            // }
            goodSpecs.setPriceDay(ArithUtil.intPennyToBigDollar(intValuePrice));
            // goodSpecs.setOriginalPrice(ArithUtil.intPennyToBigDollar(intValueOriginalPrice));
            Integer rentDays = goodSpecs.getRentDays();
            if (StringUtil.isBlank(rentDays)) {
                return Result.fail("起租天数不能为空！");
            }
            if (rentDays < 5) {
                return Result.fail("起租天数必须大于4！");
            }
            if (StringUtil.isBlank(goodSpecs.getDeposit())) {
                return Result.fail("保证金不能为空！");
            }
            if (StringUtil.isBlank(goodSpecs.getPercentageTotalFirst())) {
                return Result.fail("租赁第一次分成金额不能为空！");
            }
            double doubleValue = goodSpecs.getPercentageTotalFirst().doubleValue();
            if (doubleValue >= 1 || doubleValue < 0) {
                return Result.fail("租赁第一次分成金额百分比不能小于0并且不能大于1！");
            }
        }

        return Result.success();
    }

    /**
     * 通过id更新(局部更新)
     * 
     * @param goodSpecs
     * @return
     */
    public static Result<?> updateOneById(GoodSpecs goodSpecs) {
        if (StringUtil.isBlank(goodSpecs.getId())) {
            return Result.fail("ID不能为空！");
        }
        BigDecimal originalPrice = goodSpecs.getOriginalPrice();
        BigDecimal price = goodSpecs.getPrice();
        if (StringUtil.isNotBlankObjectListOne(originalPrice, price)) {
            // if (StringUtil.isBlank(originalPrice)) {
            // return Result.fail("原价不能为空！");
            // }
            if (StringUtil.isBlank(price)) {
                return Result.fail("单价不能为空！");
            }
            // int intValueOriginalPrice = originalPrice.intValue();
            int intValuePrice = price.intValue();
            if (intValuePrice < 1) {
                return Result.fail("单价不能小于0.01！");
            }
            // if (intValuePrice > intValueOriginalPrice) {
            // return Result.fail("单价不能大于原价！");
            // }
            // goodSpecs.setOriginalPrice(ArithUtil.intPennyToBigDollar(intValueOriginalPrice));
            goodSpecs.setPrice(ArithUtil.intPennyToBigDollar(intValuePrice));
        }

        return Result.success();
    }

    /**
     * 通过id更新(局部更新)(启用,禁用)
     * 
     * @param goodSpecs
     * @return
     * @throws SQLException
     */
    public static Result<?> updateStatusById(GoodSpecs goodSpecs) {
        if (StringUtil.isBlank(goodSpecs.getId())) {
            return Result.fail("ID不能为空！");
        }
        if (StringUtil.isBlank(goodSpecs.getStatus())) {
            return Result.fail("状态不能为空！");
        }

        return Result.success();
    }

    /**
     * 添加库存
     * 
     * @param goodSpecs
     * @return
     * @throws SQLException
     */
    public static Result<?> addStock(GoodSpecs goodSpecs) {
        if (StringUtil.isBlank(goodSpecs.getId())) {
            return Result.fail("ID不能为空！");
        }
        Integer stock = goodSpecs.getStock();
        if (StringUtil.isBlank(stock)) {
            return Result.fail("数量不能为空！");
        }
        if (stock < 1) {
            return Result.fail("数量不能小于1！");
        }

        return Result.success();
    }

}